import random

from django.dispatch.dispatcher import logger
from django.http import HttpResponse, JsonResponse
from django.shortcuts import render
from django.views import View
from django_redis import get_redis_connection

from libs.captcha.captcha import captcha
from libs.yuntongxun.sms import CCP

# Create your views here.
'''
请求路径：/image_codes/uuid
'''
class ImageCodeView(View):
    def get(self,request,uuid):
        '''
        image_code_text, image = captcha.generate_captcha()：
这行代码调用captcha库的generate_captcha函数生成一个图片验证码。该函数返回两个值：image_code_text（验证码文本）和image（验证码图片）。

redis_conn = get_redis_connection('code')：
这行代码调用get_redis_connection函数，传入参数'code'来获取一个连接Redis的连接对象。这个连接对象将用于将验证码文本存储到Redis中。

redis_conn.setex('img_%s' % uuid, 300, image_code_text)：
这行代码使用setex方法将验证码文本image_code_text存储到Redis中。'img_%s' % uuid是Redis中的键，其中uuid是一个唯一标识符，用于区分不同的验证码。300是过期时间，单位是秒，表示验证码在300秒后过期。image_code_text是存储的值，即验证码文本。

return HttpResponse(image, content_type='image/jpeg')：
这行代码创建一个HttpResponse对象，将验证码图片image作为响应内容返回给客户端，并且设置content_type为'image/jpeg'，告诉客户端这是一个JPEG格式的图片。
        '''
        #生成图片验证码
        image_code_text,image = captcha.generate_captcha()
        print(image_code_text)
        #保存图片验证码文本
        redis_conn=get_redis_connection('code')
        #'img_%s'%uuid的原因是将 uuid 变量的值插入到 'img_' 字符串后面，形成一个唯一的键名
        redis_conn.setex('img_%s'%uuid,300,image_code_text)
        return HttpResponse(image,content_type='image/jpeg')
    '''短信验证码'''
class SMSCodeView(View):
    def get(self,request,mobile):
        #接收参数
        #接收图片验证码的参数
        image_code = request.GET.get('image_code')
        #接收uuid
        uuid = request.GET.get('image_code_id')
        #校验参数
        #判断参数是否齐全
        if all([image_code,uuid]) is False:
            return JsonResponse({'code':400,'errmsg':'缺少必传参数'})
        #从redis中根据uuid找到验证码
        redis_conn = get_redis_connection('code')
        image_code_server = redis_conn.get('img_%s' % uuid)
        #判断验证码是否过期
        if image_code_server is None:
            return JsonResponse({'code':400,'errmsg':'图片验证码过期'})
        #删除图形验证码，避免恶意测试图形验证码
        try:
            redis_conn.delete('img_%s' % uuid)
        except Exception as e:
            logger.error(e)
        # 对图片验证码进行解码
        image_code_server = image_code_server.decode()
        # 判断用户输入的图片验证码是否和redis中一致
        if image_code.lower() != image_code_server.lower():
            return JsonResponse({'code': 400, 'errmsg': '输入图片验证码有误'})
        # 随机生成短信验证码：生成6位数验证码
        sms_code = '%06d' % random.randint(0, 999999)
        #在控制台显示短信验证码
        logger.info(sms_code)
        print(sms_code)
        #设置一个是否已发送的标记
        send_flag=redis_conn.get("send_flag_%s" % mobile)
        if send_flag:
            return JsonResponse({'code':400,'errmsg':'短信发送过于频繁'})
        # 创建redis管道
        redis_conn2 = redis_conn.pipeline()
        #根据手机号作为键，将短信验证码保存在redis中，并设置有效期
        redis_conn2.setex('sms_%s' % mobile, 300, sms_code)
        # 写入标记
        redis_conn2.setex("send_flag_%s" % mobile, 60, 1)
        # 执行管道
        redis_conn2.execute()
        # # 发送短信验证码
        # CCP().send_template_sms(mobile,[sms_code,5],1)
        #使用celery发送验证码
        from celery_tasks.sms.tasks import send_sms_code
        send_sms_code.delay(mobile,sms_code)
        # 返回响应
        return JsonResponse({'code': 0, 'errmsg': '发送短信成功'})


